#include "reg_mod_compra.h"
#include "ui_reg_mod_compra.h"
#include <QSpinBox>
#define CREDITO "crédito"
#define CONTADO "contado"
#define PENDIENTE "pendiente"
#define REALIZADA "realizada"
#define ACTIVO "activo"

Reg_mod_compra::Reg_mod_compra(QWidget *parent, Compra *compra) :
    QDialog(parent),
    ui(new Ui::Reg_mod_compra)
{
    ui->setupUi(this);

    setWindowTitle("Registrar Compra");

    ui->idLabel->setVisible(false);
    id_compra = 0;
    ui->verPagoPushButton->setVisible(false);
    ui->descuentoLineEdit->setEnabled(false);
    ui->proveedorAuxLabel->setVisible(false);
     ui->creditoGroupBox->setVisible(false);
    ui->rucLineEdit->setEnabled(false);

    QDjangoQuerySet<Proveedor> proveedores;
    QDjangoQuerySet<Detalle_compra> detalles;
    QDjangoQuerySet<Insumo_Proveedor> insumosProvs;
    QDjangoQuerySet<Cuentas_por_pagar> cuentas;

//    if (proveedores.count() != 0 && detalles.count() != 0 &&
//            insumosProvs.count() != 0 && cuentas.count() != 0)
//    {
        QStringList *lista = new QStringList();

        foreach (const Proveedor &prov, proveedores)
        {
            if (prov.getEstado() == ACTIVO)
            {
              lista->append(prov.getNombre());
            }
        }

        QCompleter* completer = new QCompleter(*lista);
        completer->setCaseSensitivity(Qt::CaseInsensitive);
        ui->proveedorLineEdit->setCompleter(completer);

        validatorNum = new QIntValidator(1, 100);
        ui->descuentoLineEdit->setValidator(validatorNum);

        validatorString = new QRegExpValidator(QRegExp("[^0-9]{50}"),this);
        ui->proveedorLineEdit->setValidator(validatorString);

        //formato factura 3-3-8
        ui->facturaLineEdit->setInputMask("999-999-99999999");

        //Caso modificación
        if (compra != NULL)
        {
            id_compra = compra->getId_compra();
            this->setWindowTitle("Detalle compra");

            ui->proveedorLineEdit->setText(compra->getProveedor()->getNombre());
            ui->rucLineEdit->setText(compra->getProveedor()->getRuc());
            ui->dateEdit->setDate(compra->getFecha());
            ui->facturaLineEdit->setText(compra->getNumero_factura());

            detalles = detalles.filter(QDjangoWhere("compra_id", QDjangoWhere::Equals, compra->getId_compra()));

            int aux = 0;

            // Se carga tabla de detalle
            foreach (const Detalle_compra &det, detalles)
            {
                ui->compraTableWidget->insertRow(ui->compraTableWidget->rowCount());
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 0),det.getInsumo_proveedor()->getInsumo()->getNombre());
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 1), det.getInsumo_proveedor()->getPrecio());
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 2), det.getCantidad());
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 3), det.getPorcentaje_descuento());
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 4), det.getMonto_descuento());
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 5), det.getMonto_iva());
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 6), det.getSubtotal());
            }

            //Se carga tabla de insumos y precios
            foreach (const Insumo_Proveedor &ins, insumosProvs)
            {
                foreach (const Detalle_compra &det, detalles)
                {
                    if (ins.getId_insumo_proveedor() == det.getInsumo_proveedor()->getId_insumo_proveedor())
                    {
                        aux = 1;
                    }
                }

                if (aux != 1)
                {
                    ui->insumosTableWidget->insertRow(ui->insumosTableWidget->rowCount());
                    ui->insumosTableWidget->model()->setData(ui->insumosTableWidget->model()->index(ui->insumosTableWidget->rowCount()-1, 0), ins.getInsumo()->getNombre());
                    ui->insumosTableWidget->model()->setData(ui->insumosTableWidget->model()->index(ui->insumosTableWidget->rowCount()-1, 1), ins.getPrecio());
                }
                aux = 0;
            }

            // Caso crédito - Se permite visualizar pero no modificar
            if(compra->getTipo_pago() == CREDITO)
            {

                 ui->creditoGroupBox->setVisible(true);
                 ui->creditoPushButton->setVisible(false);
                ui->creditoRadioButton->setChecked(true);
                ui->cancelarPushButton->setText("Atrás");
                Cuentas_por_pagar *cuenta = cuentas.filter(QDjangoWhere("compra_id", QDjangoWhere::Equals, compra->getId_compra())).at(0);
                ui->cuotasSpinBox->setValue(cuenta->getNumero_cuotas());
                ui->diasSpinBox->setValue(cuenta->getLapso_dias());
                ui->compraTableWidget->setEnabled(false);
                ui->insumosTableWidget->setEnabled(false);
                ui->compraGroupBox->setEnabled(false);
                ui->ordenCompraCheckBox->setEnabled(false);
                ui->agregarInsumoPushButton->setEnabled(false);
                ui->removerInsumoPushButton->setEnabled(false);
                QDate fec = ui->dateEdit->date();
                ui->ordenCompraCheckBox->setVisible(false);

                if(compra->getEstado() == REALIZADA)
                {
                    ui->registrarPushButton->setEnabled(false);
                    ui->registrarPushButton->setVisible(false);
                    ui->verPagoPushButton->setVisible(true);
                    ui->agregarInsumoPushButton->setEnabled(false);
                    ui->removerInsumoPushButton->setEnabled(false);
                    ui->proxPagoLabel->setText("Último pago");
                    ui->proximoPagoDateEdit->setDate(fec.addDays(ui->diasSpinBox->text().toInt()*ui->cuotasSpinBox->text().toInt()));
                }
                else
                {
                     ui->proximoPagoDateEdit->setDate(fec.addDays(ui->diasSpinBox->text().toInt()*cuenta->getNumero_cuota_actual()));
                }
            }

            // Caso contado - Se permite visualizar pero no modificar
            if(compra->getTipo_pago() == CONTADO)
            {
                ui->cancelarPushButton->setText("Atrás");
                ui->contadoRadioButton->setChecked(true);
                ui->compraTableWidget->setEnabled(false);
                ui->insumosTableWidget->setEnabled(false);
                ui->compraGroupBox->setEnabled(false);
                ui->ordenCompraCheckBox->setEnabled(false);
                ui->agregarInsumoPushButton->setEnabled(false);
                ui->removerInsumoPushButton->setEnabled(false);
                ui->ordenCompraCheckBox->setVisible(false);

                if(compra->getEstado() == REALIZADA)
                {
                    ui->registrarPushButton->setEnabled(false);
                    ui->registrarPushButton->setVisible(false);
                    ui->verPagoPushButton->setVisible(true);
                    ui->agregarInsumoPushButton->setEnabled(false);
                    ui->removerInsumoPushButton->setEnabled(false);
                    ui->creditoGroupBox->setVisible(false);

                }
            }

            // No se tiene datos del pago aún, es una orden de compra - se permite mo    ui->dateEdit->setDate(QDate::currentDate());dificar.
            if(compra->getTipo_pago() == "")
            {
                ui->ordenCompraCheckBox->setChecked(true);
                ui->facturaLabel->setEnabled(false);
                ui->facturaLineEdit->setEnabled(false);
                ui->contadoRadioButton->setEnabled(false);
                ui->creditoRadioButton->setEnabled(false);
                ui->descuentoCheckBox->setEnabled(false);
                ui->descuentoLineEdit->setEnabled(false);
                ui->creditoGroupBox->setEnabled(false);
            }
        }
        else
        {
                ui->dateEdit->setDate(QDate::currentDate());
        }
    }
//}

Reg_mod_compra::~Reg_mod_compra()
{
    delete ui;
}

 //Se busca el proveedor ingresado en el line edit de proveedor.
void Reg_mod_compra::keyPressEvent(QKeyEvent *evento)
{
    QDjangoQuerySet<Proveedor> proveedores;
    QDjangoQuerySet<Insumo_Proveedor> insumosProveedores;
    Proveedor *proveedor = new Proveedor();
     Proveedor *proveedorCons = new Proveedor();

    if(proveedores.count() != 0 && insumosProveedores.count() != 0)
    {
        if (id_compra==0)
        {
            if (ui->proveedorAuxLabel->text() != ui->proveedorLineEdit->text())
            {

                ui->proveedorAuxLabel->setText(ui->proveedorLineEdit->text());

                proveedor = proveedores.filter(QDjangoWhere("nombre", QDjangoWhere::Equals, ui->proveedorLineEdit->text())).at(0);

                if (proveedor == NULL)
                {
                    int resp = cuadroMensaje("Proveedor no encontrado", "<p align=\"left\">El proveedor no existe, ¿desea registrarlo?</p>", "pregunta");

                    if (QMessageBox::Ok == resp)
                    {
                        Proveedor *proveedorAregistrar = new Proveedor();
                        QSqlQuery query;
                        query.exec("select coalesce(max(id_proveedor),0) from proveedor");
                        int maxId;
                        while (query.next())
                        {
                            maxId = query.value(0).toInt();
                        }
                        proveedorAregistrar->setId_proveedor(maxId + 1);
                        proveedorAregistrar->setNombre(ui->proveedorLineEdit->text());

                        Reg_mod_proveedor *registrarProv = new Reg_mod_proveedor(this, proveedorAregistrar);
                        registrarProv->exec();
                        delete registrarProv;

                        proveedorCons = proveedores.filter(QDjangoWhere("nombre", QDjangoWhere::Equals, proveedorAregistrar->getNombre())).at(0);
                        if (proveedorCons != NULL)
                        {
                            ui->rucLineEdit->setText(proveedorCons->getRuc());
                        }
                    }
                }
                else
                {
                    ui->rucLineEdit->setText(proveedor->getRuc());

                    insumosProveedores = insumosProveedores.filter(QDjangoWhere("proveedor_id", QDjangoWhere::Equals, proveedor->getId_proveedor()));

                    foreach(const Insumo_Proveedor &insuProv, insumosProveedores)
                    {
                        ui->insumosTableWidget->insertRow(ui->insumosTableWidget->rowCount());
                        ui->insumosTableWidget->model()->setData(ui->insumosTableWidget->model()->index(ui->insumosTableWidget->rowCount()-1,0), insuProv.getInsumo()->getNombre());
                        ui->insumosTableWidget->model()->setData(ui->insumosTableWidget->model()->index(ui->insumosTableWidget->rowCount()-1, 1), insuProv.getPrecio());
                    }
                }
            }
        }
    }

    delete proveedor;
    delete proveedorCons;
}

void Reg_mod_compra::on_proveedorLineEdit_textChanged(const QString &arg1)
{
    for (int i = 0 ; i <= ui->insumosTableWidget->rowCount(); i++)
    {
        ui->insumosTableWidget->removeRow(0);
    }

    for (int i = 0 ; i <= ui->compraTableWidget->rowCount()+1; i++)
    {
        ui->compraTableWidget->removeRow(0);
    }

    ui->proveedorAuxLabel->setText("");
    ui->rucLineEdit->setText("");
    ui->totalLabel->setText("0");
    ui->totalDescLabel->setText("0");
    ui->totalIvaLabel->setText("0");
}

// Al elegir descuento sobre el total se bloquea la columna de descuento por detalle.
void Reg_mod_compra::on_descuentoCheckBox_clicked()
{
    if (ui->descuentoCheckBox->isChecked())
    {
        ui->descuentoLineEdit->setEnabled(true);

        for(int row = 0; row < ui->compraTableWidget->rowCount(); row++)
        {
            QTableWidgetItem *item = new QTableWidgetItem();
            item->setFlags(item->flags() & ~Qt::ItemIsEditable);
            ui->compraTableWidget->setItem(row, 3, item);
        }
    }
    else
    {
        ui->descuentoLineEdit->setEnabled(false);

        for(int row = 0; row < ui->compraTableWidget->rowCount(); row++)
        {
            QTableWidgetItem *item = new QTableWidgetItem();
            item->setFlags(item->flags() | Qt::ItemIsEditable);
            ui->compraTableWidget->setItem(row, 3, item);
        }
    }
}

//Agregar insumo de la tabla de insumo a la tabla de detalle_compra.
void Reg_mod_compra::on_agregarInsumoPushButton_clicked()
{
    if (ui->descuentoCheckBox->isChecked() && ui->descuentoLineEdit->text().isEmpty())
    {
        cuadroMensaje("No se ingresó el porcentaje de descuento", "<p align=\"left\">Ingrese el porcentaje de descuento o desmarque la opción de descuento</p>", "error");
    }
    else
    {
        if (ui->insumosTableWidget->rowCount() != 0)
        {
            int cantFilasSeleccionadas = ui->insumosTableWidget->selectionModel()->selection().count();
            if (cantFilasSeleccionadas == 0)
            {
                cuadroMensaje("Ningún insumo seleccionado", "<p align=\"left\">Debe seleccionar un insumo a agregar a la compra</p>", "error");
            }
            else if (cantFilasSeleccionadas > 1)
            {
                cuadroMensaje("Más de un insumo seleccionado", "<p align=\"left\">Seleccione un insumo a la vez para agregar a la compra</p>", "error");
            }
            else if (cantFilasSeleccionadas == 1)
            {
                QModelIndexList indexes = ui->insumosTableWidget->selectionModel()->selection().indexes();

                ui->compraTableWidget->insertRow(ui->compraTableWidget->rowCount());

                QModelIndex index1 = indexes.at(0).sibling(indexes.at(0).row(), 0);
                QModelIndex index2 = indexes.at(0).sibling(indexes.at(0).row(), 1);

                // Se bloquea la edición de las columnas 0, 1, 4, 5 y 6 de la tabla de compras
                QTableWidgetItem *item = new QTableWidgetItem();
                item->setFlags(item->flags() & ~Qt::ItemIsEditable);
                ui->compraTableWidget->setItem(ui->compraTableWidget->rowCount()-1, 0, item);

                QTableWidgetItem *item2 = new QTableWidgetItem();
                item2->setFlags(item2->flags() & ~Qt::ItemIsEditable);
                ui->compraTableWidget->setItem(ui->compraTableWidget->rowCount()-1, 1, item2);

                QTableWidgetItem *item3 = new QTableWidgetItem();
                item3->setFlags(item->flags() & ~Qt::ItemIsEditable);
                ui->compraTableWidget->setItem(ui->compraTableWidget->rowCount()-1, 4, item3);

                QTableWidgetItem *item4 = new QTableWidgetItem();
                item4->setFlags(item->flags() & ~Qt::ItemIsEditable);
                ui->compraTableWidget->setItem(ui->compraTableWidget->rowCount()-1, 5, item4);

                QTableWidgetItem *item5 = new QTableWidgetItem();
                item5->setFlags(item->flags() & ~Qt::ItemIsEditable);
                ui->compraTableWidget->setItem(ui->compraTableWidget->rowCount()-1, 6, item5);

                // se setean los valores de las columnas 0, 1 y 2 de la tabla de compras
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, index1.column()), ui->insumosTableWidget->model()->data(index1));
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, index2.column()), ui->insumosTableWidget->model()->data(index2));
                ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 2), 0);

                if (ui->descuentoCheckBox->isChecked())
                {
                    ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 3), ui->descuentoLineEdit->text());
                }
                else
                {
                    ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(ui->compraTableWidget->rowCount()-1, 3), 0);
                }

                ui->insumosTableWidget->model()->removeRow(index1.row());
            }
        }
        else
        {
            cuadroMensaje("No existen insumos", "<p align=\"left\">Deben existir insumos a ser agregados en la compra</p>","error");
        }
    }
}

// Remover insumo de la tabla de detalle y regresarlo a la tabla de insumo.
void Reg_mod_compra::on_removerInsumoPushButton_clicked()
{
    if (ui->compraTableWidget->rowCount() != 0)
    {
        int cantFilasSeleccionadas = ui->compraTableWidget->selectionModel()->selection().count();
        if (cantFilasSeleccionadas == 0)
        {
            cuadroMensaje("Ningún insumo seleccionado", "<p align=\"left\">Debe seleccionar un insumo a remover de la compra</p>", "error");
        }
        else if (cantFilasSeleccionadas > 1)
        {
            cuadroMensaje("Más de un insumo seleccionado", "<p align=\"left\">Seleccione un insumo a la vez para remover de la compra</p>", "error");
        }
        else if (cantFilasSeleccionadas == 1)
        {

            QModelIndexList indexes = ui->compraTableWidget->selectionModel()->selection().indexes();

            ui->insumosTableWidget->insertRow(ui->insumosTableWidget->rowCount());

            //insumo
            QModelIndex index1 = indexes.at(0).sibling(indexes.at(0).row(), 0);

            //precio
            QModelIndex index2 = indexes.at(0).sibling(indexes.at(0).row(), 1);

            //total
            QModelIndex index6 = indexes.at(0).sibling(indexes.at(0).row(), 6);

            //IVA
            QModelIndex index5 = indexes.at(0).sibling(indexes.at(0).row(), 5);

            //Descuento
            QModelIndex index4 = indexes.at(0).sibling(indexes.at(0).row(), 4);


            ui->insumosTableWidget->model()->setData(ui->insumosTableWidget->model()->index(ui->insumosTableWidget->rowCount()-1, index1.column()), ui->compraTableWidget->model()->data(index1));
            ui->insumosTableWidget->model()->setData(ui->insumosTableWidget->model()->index(ui->insumosTableWidget->rowCount()-1, index2.column()), ui->compraTableWidget->model()->data(index2));

            double totalNuevo = ui->totalLabel->text().toDouble() - ui->compraTableWidget->model()->data(index6).toDouble();
            double ivaNuevo = ui->totalIvaLabel->text().toDouble() - ui->compraTableWidget->model()->data(index5).toDouble();
            double descuentoNuevo = ui->totalDescLabel->text().toDouble() - ui->compraTableWidget->model()->data(index4).toDouble();

            ui->compraTableWidget->model()->removeRow(index1.row());

            if(ui->compraTableWidget->rowCount() == 0)
            {
                ui->totalLabel->setText("0");
                ui->totalDescLabel->setText("0");
                ui->totalIvaLabel->setText("0");

                if (ui->creditoRadioButton->isChecked())
                {
                    ui->montoPorCuotaLabel->setText("0");
                }
            }
            else
            {
                ui->totalLabel->setText(QString::number(totalNuevo));
                ui->totalIvaLabel->setText(QString::number(ivaNuevo));
                ui->totalDescLabel->setText(QString::number(descuentoNuevo));
            }
        }
    }
    else
    {
        cuadroMensaje("No existen insumos en la compra.", "<p align=\"left\">Deben existir insumos a ser removidos de la compra</p>","error");
    }
}

//Cancelar la operación
void Reg_mod_compra::on_cancelarPushButton_clicked()
{
    this->close();
}

// Se prepara la compra para continuar con el registro del pago en otra ventana.
void Reg_mod_compra::on_registrarPushButton_clicked()
{ 
    QDjangoQuerySet<Compra> compraFacts;
    QDjangoQuerySet<Proveedor> proveedores;
    QDjangoQuerySet<Proveedor> provs;
    QDjangoQuerySet<Insumo> insumos;
    QDjangoQuerySet<Insumo_Proveedor> insumosProveedores;
    QDjangoQuerySet<Detalle_compra> detalles;

    Detalle_compra *detalleCompra = new Detalle_compra();
    Proveedor *proveedor = new Proveedor();
    Compra *compraFact = new Compra();
    Compra *compra = new Compra();
    Proveedor *prov = new Proveedor();
    Insumo *insumo = new Insumo();
    Insumo_Proveedor *insumoProveedor = new Insumo_Proveedor;
    Cuentas_por_pagar *cuenta = new Cuentas_por_pagar();

//    if(compraFacts.count() != 0 && proveedores.count() != 0 && insumos.count() != 0 &&
//            insumosProveedores.count() != 0 && detalles.count() != 0)
//    {
        int b = 0;

        if (ui->ordenCompraCheckBox->isChecked())
        {
            if (ui->proveedorLineEdit->text().isEmpty())
            {
                cuadroMensaje("Campos requeridos vacíos","verifique");
                b=1;
            }
        }
        else
        {

            if (ui->proveedorLineEdit->text().isEmpty() || (ui->facturaLineEdit->text().isEmpty()
                                                            && ui->facturaLineEdit->isEnabled()) || (!ui->contadoRadioButton->isChecked()
                                                                                                     && !ui->creditoRadioButton->isChecked() && ui->creditoRadioButton->isEnabled()
                                                                                                     && ui->contadoRadioButton->isEnabled()))
            {
                cuadroMensaje("Campos requeridos vacíos",
                              "<p align=\"left\">Debe rellenar todos los campos requeridos: <ul><li>Proveedor</li><li>N&uacute;mero de Factura</li><li>Compra contado o crédito</li></ul></p>","error");
                b = 1;
            }
        }

        if (!ui->ordenCompraCheckBox->isChecked() && !numeroFacturaEsValido(ui->facturaLineEdit->text()))
        {
            cuadroMensaje("Número de Factura no válido", "Verifique el número de factura ingresado", "error");
            b = 1;
        }
        else
        {
            compraFact = compraFacts.filter(QDjangoWhere("numero_factura", QDjangoWhere::Equals, ui->facturaLineEdit->text())).at(0);
            if (compraFact != NULL && id_compra == 0)
            {
                cuadroMensaje("Número de Factura ya existe", "Verifique el número de factura ingresado", "error");
                b = 1;
            }

            delete compraFact;
        }

        if (ui->compraTableWidget->rowCount() == 0)
        {
            cuadroMensaje("No ingresó ningún insumo a comprar", "<p align=\"left\">Agregue insumos a la compra</p>", "error");
            b = 1;
        }

        if (ui->totalLabel->text() == "0" || ui->totalLabel->text() == "0")
        {
            cuadroMensaje("Compra imcompleta", "<p align=\"left\">Verifique su compra</p>", "error");
            b = 1;
        }

        if (ui->descuentoCheckBox->isChecked() && ui->descuentoLineEdit->text().isEmpty())
        {
            cuadroMensaje("No se ingresó el porcentaje de descuento", "<p align=\"left\">Ingrese el porcentaje de descuento o desmarque la opción de descuento</p>", "error");
            b = 1;
        }

        if (ui->creditoRadioButton->isChecked() && (ui->cuotasSpinBox->text() == "0" || ui->diasSpinBox->text() == "0"))
        {
            cuadroMensaje("Detalles del pago a crédito imcompletos", "Complete los detalles del pago a crédito");
            b = 1;
        }

        if (b == 0)
        {
            proveedor = proveedores.filter(QDjangoWhere("nombre", QDjangoWhere::Equals, ui->proveedorLineEdit->text())).at(0);

            // Se cargan los datos de la compra en un objeto Compra.
            compra->setProveedor(proveedor);
            compra->setFecha(ui->dateEdit->date());
            compra->setNumero_factura(ui->facturaLineEdit->text());

            if (ui->descuentoCheckBox->isChecked())
            {
                compra->setPorcentaje_descuento(ui->descuentoLineEdit->text().toInt());
            }
            else
            {
                compra->setPorcentaje_descuento(0);
            }

            compra->setPorcentaje_iva(ui->ivaComboBox->currentText().toInt());
            compra->setTipo_pago(ui->contadoRadioButton->text().toLower());

            if (ui->creditoRadioButton->isChecked())
            {
                compra->setTipo_pago(ui->creditoRadioButton->text().toLower());
            }

            compra->setTotal_iva(ui->totalIvaLabel->text().toDouble());
            compra->setTotal(ui->totalLabel->text().toDouble());
            compra->setDescuento(ui->totalDescLabel->text().toDouble());

            if (id_compra != 0)
            {
                compra->setId_compra(id_compra);
            }
            else
            {
                QSqlQuery query;
                query.exec("select coalesce(max(id_compra)+1,1) from compra");
                int maxId;
                while (query.next())
                {
                    maxId = query.value(0).toInt();
                }
                compra->setId_compra(maxId);
            }

            //Se cargan los detalles de la compra.

            QList<Detalle_compra*> *detalleLista = new QList<Detalle_compra*>();
            QSqlQuery query;
            query.exec("select coalesce(max(id_detalle_compra)+1,1) from detalle_compra");
            int maxiId;
            while (query.next())
            {
                maxiId = query.value(0).toInt();
            }

            // Lista de detalle que se encuentra en la tabla de la BD.

            detalles = detalles.filter(QDjangoWhere("compra_id", QDjangoWhere::Equals, id_compra));

            QList<Detalle_compra*>* listaDet = new QList<Detalle_compra*>();
            for (int i=0; i<=detalles.count(); i++)
            {
                listaDet->append(detalles.at(i));
            }

            // Lista de detalle del table widget de detalle..
            for (int f = 0; f <= ui->compraTableWidget->rowCount()-1; f++)
            {
                prov = provs.filter(QDjangoWhere("nombre", QDjangoWhere::Equals, ui->proveedorLineEdit->text())).at(0);
                int idProveedor = proveedor->getId_proveedor();


                insumo = insumos.filter(QDjangoWhere("nombre", QDjangoWhere::Equals, ui->compraTableWidget->model()->index(f,0).data())).at(0);
                int idInsumo = insumo->getIdinsumo();


                insumosProveedores = insumosProveedores.filter(QDjangoWhere("proveedor_id", QDjangoWhere::Equals, idProveedor));
                insumoProveedor = insumosProveedores.filter(QDjangoWhere("insumo_id", QDjangoWhere::Equals, idInsumo)).at(0);

                query.clear();
                query.exec("select id_detalle_compra from detalle_compra where compra_id = '"+QString::number(compra->getId_compra())+
                           "' and insumo_proveedor_id = '"+QString::number(insumoProveedor->getId_insumo_proveedor())+"'");

                if(query.size()>0)
                {
                    while (query.next())
                    {
                        detalleCompra->setId_detalle_compra(query.value(0).toInt());
                    }
                }
                else
                {
                    detalleCompra->setId_detalle_compra(maxiId+f);
                }

                detalleCompra->setInsumo_proveedor(insumoProveedor);
                detalleCompra->setCompra(compra);
                detalleCompra->setCantidad(ui->compraTableWidget->model()->index(f,2).data().toInt());
                detalleCompra->setPorcentaje_descuento(ui->compraTableWidget->model()->index(f,3).data().toInt());
                detalleCompra->setMonto_descuento(ui->compraTableWidget->model()->index(f,4).data().toDouble());
                detalleCompra->setMonto_iva(ui->compraTableWidget->model()->index(f,5).data().toDouble());
                detalleCompra->setSubtotal(ui->compraTableWidget->model()->index(f,6).data().toDouble());

                detalleLista->insert(f, detalleCompra);
                detalleCompra = new Detalle_compra();
            }

            QDjango::setDebugEnabled(true);

            if ((ui->creditoRadioButton->isEnabled() && ui->creditoRadioButton->isChecked()) || (ui->ordenCompraCheckBox->isChecked()))
            {
                int resp = cuadroMensaje("Confirmación", "La compra se guardará como pendiente, ¿Desea continuar?", "pregunta");

                if (resp == QMessageBox::Ok)
                {
                    if (ui->creditoRadioButton->isChecked())
                    {
                        if (ui->diasSpinBox==0 || ui->cuotasSpinBox==0)
                        {
                            cuadroMensaje("Para factura a crédito","No pueden ser cero: <br><ul><li>Lapso de d&iacute;as</li><li>Cantidad de cuotas</li><ul>", "error");
                        }
                        else
                        {
                            //guardar en cuentas por pagar
                            cuenta->setCompra(compra);
                            cuenta->setMonto_pendiente(ui->totalLabel->text().toDouble());
                            cuenta->setNumero_cuotas(ui->cuotasSpinBox->text().toInt());
                            cuenta->setNumero_cuota_actual(1);
                            cuenta->setLapso_dias(ui->diasSpinBox->text().toInt());
                            cuenta->setMonto_abonado(0);
                            cuenta->setMonto_cuota(ui->totalLabel->text().toDouble() / ui->cuotasSpinBox->text().toDouble());
                            cuenta->setMonto_siguiente(cuenta->getMonto_cuota());

                            QSqlQuery cons;
                            cons.exec("select coalesce(max(id_cuenta),0) from cuentas_por_pagar");
                            int mId;
                            while (cons.next())
                            {
                                mId = cons.value(0).toInt();
                            }
                            cuenta->setId_cuenta(mId + 1);
                        }
                    }
                    else
                    {
                        compra->setNumero_factura("");
                        compra->setTipo_pago("");

                    }


                    compra->setEstado(PENDIENTE);
                    compra->save();

                    // En caso de haber quitado algun insumo del detalle se debe borrar de la bd
                    // Caso de modificacion / orden de compra.
                    query.clear();
                    query.exec("select id_detalle_compra from detalle_compra where compra_id = '"+QString::number(compra->getId_compra())+"'");
                    qDebug() << query.lastQuery();
                    QSqlQuery borrar;
                    bool existeDetalle = false;
                    int id_det = 0;
                    while(query.next())
                    {
                        id_det = query.value(0).toInt();
                        for (int i = 0; i <=detalleLista->count()-1; i++)
                        {
                            if(query.value(0).toInt() == detalleLista->at(i)->getId_detalle_compra())
                            {
                                existeDetalle = true;
                            }
                        }

                        if(!existeDetalle)
                        {
                            borrar.exec("delete from detalle_compra where id_detalle_compra = '" + QString::number(id_det) + "'");
                        }
                        existeDetalle = false;
                    }

                    for (int i = 0; i <= detalleLista->count()-1; i++)
                    {
                        if(compra->getTipo_pago() == CREDITO)
                        {
                            query.clear();
                            query.exec("update insumo set stock_actual= stock_actual + "
                                       + QString::number(detalleLista->at(i)->getCantidad())
                                       + ", ultima_compra= '" + QString::number(ui->dateEdit->date().day())
                                       + "-" + QString::number(ui->dateEdit->date().month()) + "-"
                                       + QString::number(ui->dateEdit->date().year())
                                       + "' where idinsumo = '" + QString::number(detalleLista->at(i)->getInsumo_proveedor()->getInsumo()->getIdinsumo())
                                       + "'");
                        }
                        detalleLista->at(i)->save();
                    }

                    if (ui->creditoRadioButton->isChecked())
                    {
                        cuenta->save();
                    }

                    cuadroMensaje("Éxito", "Compra registrada");

                    this->close();
                }
            }
            else
            {
                Reg_mod_pago_proveedores  *regPago = new Reg_mod_pago_proveedores(this, compra, detalleLista);
                regPago->exec();
                delete regPago;
                delete detalleLista;

                this->close();
            }

        }
//    }
//    delete detalleCompra;
//    delete proveedor;
//    delete compraFact;
//    delete compra;
//    delete prov;
//    delete insumo;
//    delete insumoProveedor;
//    delete cuenta;
}

//Proceso de cálculo de montos, % de IVA, % de descuento, etc de la tabla de detalle.
void Reg_mod_compra::on_compraTableWidget_cellChanged(int row, int column)
{
    if (column == 2 || column == 3)
    {
        if (!ui->compraTableWidget->model()->index(row, 3).data().isNull() || !ui->compraTableWidget->model()->index(row, 2).data().isNull())
        {
            int cantidad = ui->compraTableWidget->model()->index(row, 2).data().toInt();
            double porcIva = ui->ivaComboBox->currentText().toDouble() / 100;
            double precioDelaBd = ui->compraTableWidget->model()->index(row, 1).data().toDouble() * cantidad;
            double subTotalIvaPrecioBd = porcIva * precioDelaBd ;
            double precioNeto = precioDelaBd- subTotalIvaPrecioBd;
            double porcDescuento = ui->compraTableWidget->model()->index(row, 3).data().toDouble()/100;
            double subTotalDescuento = porcDescuento * precioNeto;
            double precioFinal;
            double subtotal;
            double subTotalIvaFinal;

            if (porcDescuento == 0)
            {
                precioFinal = precioDelaBd;
                subTotalIvaFinal = porcIva * (precioFinal - subTotalDescuento);
                subtotal = precioFinal;
            }
            else
            {
                precioFinal = precioNeto;
                subTotalIvaFinal = porcIva * (precioFinal - subTotalDescuento);
                subtotal = (precioFinal - subTotalDescuento) + subTotalIvaFinal;
            }

            //subtotal descuento
            ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(row, 4), subTotalDescuento);

            double acumDesc = 0;

            for(int i = 0; i<ui->compraTableWidget->rowCount(); i++)
            {
                acumDesc  = acumDesc + ui->compraTableWidget->model()->index(i, 4).data().toDouble();
            }

            ui->totalDescLabel->setText(QString::number(acumDesc));

            //subtotaliva
            ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(row, 5), subTotalIvaFinal);

            double acumIva = 0;

            for(int i = 0; i<ui->compraTableWidget->rowCount(); i++)
            {
                acumIva  = acumIva + ui->compraTableWidget->model()->index(i, 5).data().toDouble();
            }

            ui->totalIvaLabel->setText(QString::number(acumIva));

            //subtotal
            ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(row, 6), subtotal);

            double acumTotal = 0;

            for(int i = 0; i<ui->compraTableWidget->rowCount(); i++)
            {
                acumTotal  = acumTotal + ui->compraTableWidget->model()->index(i, 6).data().toDouble();
            }

            ui->totalLabel->setText(QString::number(acumTotal));
        }
    }
}

// Si el descuento por el total es ingresado se cargan todas
//las columnas de descuento de la tabla de detalle con ese porcentaje
void Reg_mod_compra::on_descuentoLineEdit_editingFinished()
{
    if (ui->compraTableWidget->rowCount() != 0)
    {
        for(int i = 0; i<ui->compraTableWidget->rowCount(); i++)
        {
            ui->compraTableWidget->model()->setData(ui->compraTableWidget->model()->index(i, 3), ui->descuentoLineEdit->text());
        }
    }
}

void Reg_mod_compra::on_contadoRadioButton_clicked()
{
    if (ui->contadoRadioButton->isChecked())
    {
        ui->creditoGroupBox->setVisible(false);
    }
}

void Reg_mod_compra::on_creditoRadioButton_clicked()
{
    if(ui->creditoRadioButton->isChecked())
    {
        ui->creditoGroupBox->setVisible(true);
    }
}

void Reg_mod_compra::on_ordenCompraCheckBox_clicked()
{
    if (ui->ordenCompraCheckBox->isChecked())
    {
        ui->facturaLabel->setEnabled(false);
        ui->facturaLineEdit->setEnabled(false);
        ui->contadoRadioButton->setEnabled(false);
        ui->creditoRadioButton->setEnabled(false);
        ui->contadoRadioButton->setCheckable(false);
        ui->creditoRadioButton->setCheckable(false);
        ui->creditoGroupBox->setVisible(false);
        ui->descuentoCheckBox->setEnabled(false);
        ui->descuentoLineEdit->setEnabled(false);
    }
    else
    {
        ui->facturaLabel->setEnabled(true);
        ui->facturaLineEdit->setEnabled(true);
        ui->contadoRadioButton->setEnabled(true);
        ui->creditoRadioButton->setEnabled(true);
        ui->descuentoCheckBox->setEnabled(true);
        ui->descuentoLineEdit->setEnabled(true);
        ui->contadoRadioButton->setCheckable(true);
        ui->creditoRadioButton->setCheckable(true);
    }
}

// Botón para ver el monto de las cuotas en caso de factura a crédito.
void Reg_mod_compra::on_creditoPushButton_clicked()
{
    if (ui->creditoRadioButton->isChecked() && (ui->cuotasSpinBox->text() != "0" || ui->diasSpinBox->text() != "0"))
    {
        double montoCuota = ui->totalLabel->text().toDouble() / ui->cuotasSpinBox->text().toDouble();
        ui->montoPorCuotaLabel->setText(QString::number(montoCuota));
        QDate fec = ui->dateEdit->date();
        ui->proximoPagoDateEdit->setDate(fec.addDays(ui->diasSpinBox->text().toInt()));
    }
}

//ver pago, en caso de compras facturadas.
void Reg_mod_compra::on_verPagoPushButton_clicked()
{
    QDjangoQuerySet<Compra> compras;
    Compra *compra = new Compra();
    if (compras.size() != 0)
    {
       compra = compras.filter(QDjangoWhere("id_compra", QDjangoWhere::Equals, id_compra)).at(0);

       if(compra->getTipo_pago() == CONTADO)
       {
            Reg_mod_pago_proveedores *pago = new Reg_mod_pago_proveedores(this, compra, NULL);
            pago->exec();
            delete pago;
           }
       else if (compra->getTipo_pago() == CREDITO)
       {
           Cuenta_por_pagar *ventanaCuenta = new Cuenta_por_pagar(this, compra);
           ventanaCuenta->exec();
           delete ventanaCuenta;
       }
    }

    delete compra;
}

#undef CONTADO
#undef CREDITO
#undef PENDIENTE
#undef REALIZADA

